home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / GW AdaEd 1.4.2 / GWAdaDemos / NYUDemos / HILBERT.ADA < prev    next >
Text File  |  1993-12-14  |  2KB  |  68 lines

  1. with screen_io, maze; use screen_io , maze;
  2. with my_int_io; use my_int_io ;
  3. procedure hilbert is
  4.    here: position ;
  5.    this_way: direction := up;
  6.    last_d: direction := up;
  7.    order: integer ;
  8.    procedure draw_line(l: integer) is
  9.        c: character ;
  10.        steps: integer := l ;
  11.    begin
  12.        if this_way = right or this_way = left then 
  13.        c := '_' ; 
  14.        steps := 2* l ;   -- looks better this way.
  15.        else 
  16.        c := '|' ;
  17.        end if ;
  18.        if steps = 0 then steps := 1 ; end if ;
  19.        if this_way = down  or last_d = down then
  20.           for i in 1..steps loop
  21.           here := next_pos(here, this_way) ;
  22.           putc(c, here.row, here.col) ;
  23.           end loop ;
  24.        else
  25.           for i in 1..steps loop
  26.           putc(c, here.row, here.col) ;
  27.           here := next_pos(here, this_way) ;
  28.           end loop ; 
  29.        end if ;
  30.        last_d := this_way ;
  31.    end draw_line ;
  32.    procedure turn(left_first: boolean) is
  33.    begin
  34.     if left_first then this_way := left_of(this_way) ; 
  35.         else this_way := right_of(this_way) ;
  36.     end if ;
  37.    end turn ;
  38.    procedure draw_hilbert(size, level: integer; left_first: boolean)  is
  39.    begin
  40.      if level = 0 then return ;
  41.      else
  42.     turn(left_first) ;
  43.         draw_hilbert(size, level - 1, not left_first) ;
  44.     draw_line(size) ;
  45.     turn(not left_first) ;
  46.         draw_hilbert(size, level - 1, left_first) ;
  47.     draw_line(size) ;
  48.         draw_hilbert(size, level - 1, left_first) ;
  49.     turn(not left_first) ;
  50.     draw_line(size) ;
  51.         draw_hilbert(size, level - 1, not left_first) ;
  52.     turn(left_first) ;
  53.      end if ;
  54.    end draw_hilbert ;
  55. begin
  56.    loop
  57.       clear ;
  58.       for i in 1..4 loop
  59.          here := (22, 60) ;
  60.      clear ;
  61.      puts("Hilbert's curve", 2, 62) ;
  62.      --puts("  level  "& integer'image(i), 3, 62) ;
  63.      putsn("  level  ", i, 3, 62) ;
  64.          draw_hilbert(integer(24.0/(2**i+1)), i, true);
  65.       end loop ;
  66.       end loop ;
  67. end ;
  68.